package com.example.tokentest2_7_x.config.interceptor;


import com.example.tokentest2_7_x.config.component.PassToken;
import com.example.tokentest2_7_x.redispackage.RedisCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;

/**
 * \* @author: wky
 * \* Date: 2021/09/08
 * \* Time: 10:10
 * \* To change this template use File | Settings | File Templates.
 * \* Description:MyInterceptor
 * \
 */
@Component
public class MyInterceptor implements HandlerInterceptor {

    @Autowired
    RedisCache redisCache;


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //return true;
        //从请求头中获取token
        String token = request.getHeader("token");

        //如果是配置，即直接放行
        if (request.getMethod().equals("OPTIONS")) {
            return true;
        }

        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        //检查方法是否有passtoken注解，有则跳过认证，直接通过
        if (method.isAnnotationPresent(PassToken.class)) {
            PassToken passToken = method.getAnnotation(PassToken.class);
            if (passToken.required()) {
                return true;
            }
        }

        if(token == null) {
            //添加提示信息，用于返回给前端？
            request.getSession().setAttribute("msg","请先登录!");
            //重定向到根目录，即登录页面，如果是前后端分离，是否可以省略？
            request.getRequestDispatcher("/").forward(request,response);
            return false;
        }

        //查询数据库代码需要自己实现
        String dbToken = redisCache.getCacheObject("token2_7_x");
        if(dbToken!=null && dbToken.equals(token)){
            redisCache.setCacheObject("token2_7_x",dbToken,5, TimeUnit.MINUTES);//刷新时间
            return true;
        }

        //添加提示信息，用于返回给前端？
        request.getSession().setAttribute("msg","请先登录!");
        //重定向到根目录，即登录页面，如果是前后端分离，是否可以省略？
        request.getRequestDispatcher("/").forward(request,response);
        //返回false，表明拒绝执行该方法
        return false;
    }
}